/**
 * 如果一个数组，不同偶数的数量等于不同奇数的数量，就称为是平衡的
 * 给定一个数组，求最长平衡子数组
 * 
 * 首先如果所有数都是不同的，则令奇数为1，偶数为-1，求一个前缀和后
 * 如果S[L] == S[R]，则说明从[L+1...R]是平衡的，因此只需要在前缀和数组中找相同值出现的位置即可
 * 
 * 现在要求统计不同奇数的数量，也就是说若干个位置上的相同数，只有一个能设为1，其余均应为0
 * 这是一个典型用法，只需要令最后一个位置为1，前面的位置为0即可，这是权值数组的用法
 * 
 * 令权值数组为A，需要求和与修改，如果仅限于此可以使用树状数组。
 * 但这是一个动态操作，当到达i时，假设改完之后得到的A[1...i]的和记作Si
 * 如何查找Si第一次出现的位置？此时不能使用数组简单的记录
 *  
 * for i in [1, N]:
 *     令vi是当前数值
 *     令pre = Pre[vi]
 *     if pre 存在:
 *         if vi 是奇数:
 *             assert A[pre] == 1
 *             将Ai减一
 *         else:
 *             assert A[pre] == -1
 *             将Ai加一                
 *     if vi 是奇数:
 *         Ai = 1
 *     else:
 *         Ai = -1
 *     令 si = A[1...i] 的和，是正确的前缀和
 *     此时要找si在S中最早出现的位置
 *     注意不能简单记录，假设First[si]位于pre之后、i之前
 *     则此时First[si]的数据是不对的，因为pre的修改影响到了
 *     注意到pre位置之后的前缀和数据被成片改动过，
 *     所以相当于要在成片改动的数据段找到某一个数第一次出现的位置
 *     一般情况下似乎没有好的做法
 *     但是注意到此处的修改操作不是加一就是减一，因此值必然是连续变化的
 *     所以可以记录整个过程中出现的最大值与最小值，则该区间内的值必然是出现过的
 *     可以使用二分解决这个问题，注意这里针对的是前缀和S数组
 *     因此我们要维护S数组的最大值与最小值，然后A数组上的单点加减一，
 *     反映在S数组上就是成片修改，因此用线段树维护
 */

struct FenwickTree{ // 树状数组

using value_type = long long int;
using vec_type = vector<value_type>;

int n;
vec_type c;

FenwickTree() = default;

static int lowbit(int x){return x & -x;}

void init(int nn){this->c.assign((this->n=nn) + 1, 0);}

void modify(int pos, value_type delta){
    for(int i=pos;i<=this->n;i+=lowbit(i)) this->c[i] += delta;
}

value_type query(int pos)const{
    value_type ans = 0;
    for(int i=pos;i;i-=lowbit(i)) ans += this->c[i];
    return ans;
}

value_type query(int s, int e)const{return this->query(e) - this->query(s - 1);}

};


class Solution {

map<int, int> First;
vector<int> Pre;

public:
    int longestBalanced(vector<int>& nums) {
        int n = nums.size();
        nums.insert(nums.begin(), 0);
        
        FenwickTree bt;
        bt.init(n);

        Pre.assign(1E5 + 1, 0);

        for(int i=1;i<=n;++i){
            auto vi = nums[i];
            if(Pre[vi]){
                assert(bt.query())
            }
        }
    }
};